/**
 * FrontController steuert die Anweisungen des Benutzers w�hrend des Spiels.
 *
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.game;

import java.awt.event.*;
import risk.player.PlayerModel;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

public class FrontController implements ActionListener,MouseListener
{
    /**
     * Das zugehoerige RiskModel
     */
    private RiskModel riskModel;
    
    /**
     * Das zugehoerige mapView
     */
    private Board board;
    
    public FrontController(RiskModel rm, Board board)
    {
        riskModel = rm;
        this.board = board;
     
    }
    
    /**
     * Prüft, ob die Maus ueber einem Land ist und in welcher Phase das Spiel ist
     * und ruft die Phasenentscheidenden Methoden auf.
     * auf das jeweilige Land.
     *
     * @param MouseEvent e Das zu uebergebende Event
     */    
    public void mouseClicked (MouseEvent e) 
    {
        if (e.getButton() == MouseEvent.BUTTON1){
            ArrayList<Territory> territories = riskModel.getWorldMap().getTerritories();
            double xmouse = e.getX();
            double ymouse = e.getY();
            for (int i=0; i<territories.size(); i++){
                Territory tmpTerritory = territories.get(i);
                //Prüfen, ob die Maus innerhalb eines Landes ist
                if (tmpTerritory.getFrontiers().contains(xmouse, ymouse) == true){
                    //Gemaess Spielphase entsprechend vorgehen
                    switch(riskModel.getState()){
                        case 0:{
                            //System.out.println("FrontController: mouseClicked switch 0");
                            if(riskModel.getActivePlayer().setUnit(tmpTerritory)){
                                riskModel.nextPlayer();
                                if(riskModel.getActivePlayer().getUnitCount()==0){
                                    riskModel.checkContinentBonus();
                                    riskModel.doState(1);
                                }
                            }else{
                                System.out.println("Bitte eigenes Land waehlen");
                            }
                            break;
                        }
                        case 1:{
                            //Truppensetzen und pruefen, ob die Phase gewechselt wird.
                            //System.out.println("FrontController: mouseClicked switch 1");
                            if(riskModel.getActivePlayer().setUnit(tmpTerritory)&&riskModel.getActivePlayer().getUnitCount()==0&&riskModel.getActivePlayer().getCardCount()<5){
                                riskModel.doState(2);
                            }
                            break;
                        }
                        case 2:{
                            //Kampfphase
                            riskModel.battleState(tmpTerritory);
                            //System.out.println("FrontController: mouseClicked switch 2");
                            break;
                        }
                        case 3:{
                            //Truppenbewegung
                            riskModel.moveTrupps(tmpTerritory);
                            //System.out.println("FrontController: mouseClicked switch 3");
                            break;
                        }
                    }

                }
            }
        }
    }
     
    public void mouseReleased (MouseEvent e) { }
    public void mousePressed  (MouseEvent e) { }
    public void mouseEntered  (MouseEvent e) {
        /**
        ArrayList<Territory> territories = riskModel.getWorldMap().getTerritories();
        double xmouse = e.getX();
        double ymouse = e.getY();
        for (int i=0; i<territories.size(); i++){
            Territory tmpTerritory = territories.get(i);
            if (tmpTerritory.getFrontiers().contains(xmouse, ymouse) == true){
                MapView mv = new MapView(riskModel.getWorldMap());
                Graphics g = mv.getGraphics();
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.GREEN);
                g2d.drawString(tmpTerritory.getName(), 
                    (int) tmpTerritory.getMidpoint().getX() - 15, 
                    (int) tmpTerritory.getMidpoint().getY() - 10);
                                
                //Farbe der Laenderbezeichnung soll ge�ndert werden, wenn man mit der Maus
                //drueber geht... dazu muss ich irgendwie ein setColor in der mapView
                //machen, aber da komme ich nicht ran...vielleicht gehts ja so, aber ich weiss
                //nicht, was genau getGraphics(); mir da liefert
                
            }
        }
         */
    }
    public void mouseExited   (MouseEvent e) {
        /*
    ArrayList<Territory> territories = riskModel.getWorldMap().getTerritories();
        double xmouse = e.getX();
        double ymouse = e.getY();
        for (int i=0; i<territories.size(); i++){
            Territory tmpTerritory = territories.get(i);
            if (tmpTerritory.getFrontiers().contains(xmouse, ymouse) == true){
                MapView mv = new MapView(riskModel.getWorldMap());
                Graphics g = mv.getGraphics();
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.WHITE);
                g2d.drawString(tmpTerritory.getName(), 
                    (int) tmpTerritory.getMidpoint().getX() - 15, 
                    (int) tmpTerritory.getMidpoint().getY() - 10);
            }
        }
         */
    }
    public void mouseMoved    (MouseEvent e) { }
    public void mouseDragged  (MouseEvent e) { }

    public void actionPerformed(ActionEvent e) {
        if ("moveMilitary".equals(e.getActionCommand())){
            riskModel.endOfMovedTrupps(true);
            System.out.println("FrontController: actionPerformed: moveMititary");
        }else if("change".equals(e.getActionCommand())){
            riskModel.doState(2);
            System.out.println("FrontController: actionPerformed: kartentauschen");
        }else if("notChange".equals(e.getActionCommand())){
            riskModel.doState(2);
            System.out.println("FrontController: actionPerformed: keine karten tauschen");
        }else if("finishCombatState".equals(e.getActionCommand())){
            //riskModel.resetCombatModel();
            riskModel.doState(3);
            System.out.println("FrontController: actionPerformed: kampf beenden");
        }else if("keineTruppenbewegung".equals(e.getActionCommand())){
            riskModel.endOfMovedTrupps(false);
            riskModel.nextPlayer();
            riskModel.doState(1);
            System.out.println("FrontController: actionPerformed: keine truppen bewegen");
        }else if("checkContinentBonus".equals(e.getActionCommand())){
            riskModel.checkContinentBonus();
            System.out.println("checkContinentBonus performed");
        }else if("checkEndOfGame".equals(e.getActionCommand())){
            riskModel.checkEndOfGame();
            System.out.println("checkEndOfGame performed");
        }
    }
}